//
//  MFWClick.h
//  MFWClick framework
//
//  Created by hanxin on 11/6/12.
//  Copyright (c) 2012 mafengwo. All rights reserved.


/*
 新增方法 mfwuuid
 改为从cookie里的mfw_uuid取（原__mfwuuid）
 */
#define MFWClick_SDK_VERSION    @"20150122"

///*
// basic补充sys_ver
// */
//#define MFWClick_SDK_VERSION    @"20150106"

/*
 设置mobclick shortVerstion
 
 */
//#define MFWClick_SDK_VERSION    @"20141104"

/*
 新增网页打通，每次启动时访问蚂蜂窝网页，读取Cookie并设置openudid
 
 读Cookie的__mfwuuid，并作为基础参数放到事件的basic里（key为mfwuuid）
 写Cookie的__openudid（过期时间1年）
 
 */
//#define MFWClick_SDK_VERSION    @"20141104"

/*
 新增应用安装情况监测：app_install
 */
//#define MFWClick_SDK_VERSION    @"20141102"

/*
 页面事件增加触发点的记录
 */
//#define MFWClick_SDK_VERSION    @"20140829"


///*
// 修复多线程下同时修改 self.arraySendingEventDict 导致的异常
// */
//#define MFWClick_SDK_VERSION    @"20140728"

/*
 新增发送策略：退出时批量发送本次启动的日志
 */
//#define MFWClick_SDK_VERSION    @"20140707"


/*
 by hanxin
 */
//#define MFWClick_SDK_VERSION    @"20140507"


/*
 by hanxin 在基础字典basic中，新增device_token
 */
//#define MFWClick_SDK_VERSION    @"20131209"

/*
 by hanxin 精简接口
 by hanxin 支持TalkingData
 by hanxin 在基础字典basic中，新增idfa和idfv
 */
//#define MFWClick_SDK_VERSION    @"20131021"

/*
 Version 20130731
 
 by hanxin 友盟日志发送策略改为按最小间隔发送
 */
//#define MFWClick_SDK_VERSION    @"20130731"


/*
 Version 20130730
 
 by hanxin 新增接口setUserId，使MFWClick与MSUserManager解耦
 */
//#define MFWClick_SDK_VERSION    @"20130730"

/*
 Version 20130629
 
 by hanxin 设备信息增加adid（设备唯一广告标识）
 */
//#define MFWClick_SDK_VERSION    @"20130629"

/*
 Version 20130427
 
 by hanxin 新增接口：event:publicAttributesBlock:privateAttributesBlock:
 */
//#define MFWClick_SDK_VERSION    @"20130427"

/*
 Version 20130426
 
 by hanxin GPS信息同时发送给友盟
 */
//#define MFWClick_SDK_VERSION    @"20130426"

/*
 Version 20130419
 
 by hanxin 设备信息增加mac记录
 by hanxin 废弃device_id
 by hanxin basic信息新增用户id：uid
*/
//#define MFWClick_SDK_VERSION    @"20130419"

/*
 
 Version 20121210
 by hanxin 增加传SDK版本号信息,且将sdk版本号改为日期形式
 by hanxin @“App Store” 和 @“Apple Store”都默认为@""
 
 Version 1.1.0
 by hanxin 新增接口    + (void)event:(NSString *)eventCode publicAttributes:(NSDictionary*)publicAttr privateAttributes:(NSDictionary*)privateAttr;
 by hanxin 获取基本信息失败时，在Debug情况下抛异常
 
 
 Version 1.0.0
 by hanxin 文件创建
 */
//#define MFWClick_SDK_VERSION    @"20121210"


#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>

#include <sys/types.h>
#include <sys/sysctl.h>
#import <CommonCrypto/CommonDigest.h>


@interface NSString (Gzip)
- (NSData *)compress;
@end


/** 页面触发点生成 */
@interface MFWClickTrigger : NSObject

/** 触发点生成 */
+(instancetype)triggerWithPage:(NSString*)page
                         point:(NSString*)point
                        object:(id)object
                   prevTrigger:(MFWClickTrigger*)preTrigger;

/** 触发点生成 */
+(instancetype)triggerWithPage:(NSString*)page
                         point:(NSString*)point
                    objectType:(NSString*)objectType
                      objectId:(NSString*)objectId
                   prevTrigger:(MFWClickTrigger*)preTrigger;


- (NSDictionary*)eventDictPublic;
- (NSDictionary*)eventDictPrivate;

- (NSString*)path;

@end


/** Controller基类日志协议 */
@protocol MFWClickControllerProtocol <NSObject>

@required

/** 上一个页面触发此页面生成的触发点 */
@property(nonatomic, strong) MFWClickTrigger* triggerPrevious;

/** 页面名称 */
-(NSString*)pageName;

/** 创建此页面的一个触发点 */
-(MFWClickTrigger*)triggerAtPoint:(NSString*)point
                           object:(id)object;

@end



// 发送策略
typedef enum {
    MFWClickReportPolicyRealTime = 0,       // 实时发送
    MFWClickReportPolicyOnExit = 1,     // 退出到后台时发送
} MFWClickReportPolicy;



/*
    蚂蜂窝事件记录：
 
    整合步骤：
        MFWClick startWithReportPolicy: channelCode:
 
 */
@interface MFWClick : NSObject<CLLocationManagerDelegate>

#pragma mark 调试参数
// 用于调试时是否打印出日志
+ (void)setLogEnabled:(BOOL)value;
// 禁止校验（默认在开发环境下做各种合法性校验）
+ (void)setDisableCheck:(BOOL)value;


#pragma mark ------ 开启蚂蜂窝事件记录
// channelCode 为nil或@""时,被当作@"App Store"渠道
+ (void)startWithReportPolicy:(MFWClickReportPolicy)rp
                  channelCode:(NSString*)channelCode
                  umengAppKey:(NSString*)umengAppKey
            talkingDataAppKey:(NSString*)talkingDataAppKey;

#pragma mark ------ 设置用户id
+ (void)setUserId:(NSString*)uid;

#pragma mark ------ 特殊事件记录

#pragma mark 记录推送通知
// 记录设备的deviceToken(之前发送过，则不再发送)
+ (void)eventDeviceTokenIfChanged:(NSData *)deviceTokenData;


#pragma mark ------ 通用事件记录

#pragma mark 页面访问
+ (void)beginLogPageView:(NSString*)pageName;
+ (void)endLogPageView:(NSString*)pageName;
+ (void)beginLogPageViewWithTrigger:(MFWClickTrigger*)trigger pageName:(NSString*)pageName;
// 确保trigger与调用begin时是一个实例
+ (void)endLogPageViewWithTrigger:(MFWClickTrigger*)trigger pageName:(NSString *)pageName;


#pragma mark 事件记录

+(void)event:(NSString *)eventCode trigger:(MFWClickTrigger*)trigger publicAttributesBlock:(NSDictionary*(^)(void))pubAttrBlock privateAttributesBlock:(NSDictionary*(^)(void))priAttrBlock;

// 已开启友盟日志时调用（privateAttributes只会发送到MFW服务器，不会发送到友盟）（功能同上，推荐使用，代码会清晰）（能抓异常）
+ (void)event:(NSString *)eventCode
publicAttributesBlock:(NSDictionary*(^)(void))pubAttrBlock
privateAttributesBlock:(NSDictionary*(^)(void))priAttrBlock;

#pragma mark 公开属性
+ (NSString *)mfwUUID;

#pragma mark 辅助方法
// 生成一个全局唯一标识符
+ (NSString *)GetUUID;



// 生成json字串
+ (NSString*)stringEncodingJsonObject:(id)obj;

#pragma mark 已废弃的接口
//+ (void)startWithReportPolicy:(MFWClickReportPolicy)rp channelCode:(NSString*)channelCode;
//// 事件记录（暂时屏蔽）
//+ (void)event:(NSString *)eventCode;
//+ (void)event:(NSString *)eventCode label:(NSString *)label;
//// 未开启友盟日志时调用（eventCode和attributes里的key应为小写，允许有下划线）
//+ (void)event:(NSString *)eventCode attributes:(NSDictionary *)attributes;
//// 已开启友盟日志时调用（umengIgnoreKeys中列出的key:value对不会发送到友盟）（eventCode和attributes里的key应为小写，允许有下划线）
//+ (void)event:(NSString *)eventCode attributes:(NSDictionary *)attributes umengIgnoreKeys:(NSArray*)ignoreKeys;
//// 已开启友盟日志时调用（privateAttributes只会发送到MFW服务器，不会发送到友盟）（功能同上，推荐使用，代码会清晰）
//+ (void)event:(NSString *)eventCode publicAttributes:(NSDictionary*)publicAttr privateAttributes:(NSDictionary*)privateAttr;
@end
